package pl.gettoknowme.mobile.android.integration;

import java.util.List;

import android.content.Context;
import android.content.SharedPreferences;

import pl.gettoknowme.mobile.android.MainActivity;
import pl.gettoknowme.mobile.android.network.NetworkException;
import pl.gettoknowme.mobile.android.network.NetworkManager;
import pl.gettoknowme.mobile.android.network.request.impl.SmsSexAnalysisHttpRequestWrapper;
import pl.gettoknowme.mobile.android.network.response.HttpResponseWrapper;
import pl.gettoknowme.mobile.android.services.sms.SmsMessage;
import pl.gettoknowme.mobile.android.services.sms.SmsReader;
import pl.gettoknowme.mobile.android.services.sms.SmsSexAnalyzer;
import pl.gettoknowme.mobile.android.util.Constants;
import pl.gettoknowme.mobile.android.util.LoggingUtil;

/**
 * Wykonanie wątku analizującego i przesyłającego predykcję płci uzytkownika
 * @author Michał Kołodziejski
 */
public class SexAnalysisIntegrationRunnable implements Runnable {

    private Context context;
    private String userId;
    
    public SexAnalysisIntegrationRunnable(Context context, String userId) {
        this.context = context;
        this.userId = userId;
    }
    
    @Override
    public void run() {
        float maleProbability = readAndAnalyzeSmsList();
        boolean successfulAnalysis;
        
        if(maleProbability < 0.0f){
            // płeć niemożliwa do ustalenia
            successfulAnalysis = false;
            
        } else {
            successfulAnalysis = true;
        }
        
        // wysyłamy
        if(sendAPIRequest(successfulAnalysis, maleProbability)){
            LoggingUtil.d(this, "API request finished successfully");
            // zapisujemy informację w SP
            SharedPreferences sharedPreferences = context.getSharedPreferences(MainActivity.class.getName(), 
                    Context.MODE_PRIVATE);
            sharedPreferences.edit()
                    .putBoolean(Constants.USER_SEX_ANALYZED_SHARED_PREFERENCES_KEY, true)
                    .commit();
        }
    }
    
    /**
     * Odczytuje wszystkie SMS-y i poddaje je analizie płci użytkownika
     * @return prawdopodobieństwo, że użytkownik jest mężczyzną lub -1, jeżeli
     *          nie można tego stwierdzić
     */
    protected float readAndAnalyzeSmsList(){
        SmsReader smsReader = new SmsReader(context);
        List<SmsMessage> smsList = smsReader.getSmsList(null, null);
        
        SmsSexAnalyzer smsSexAnalyzer = new SmsSexAnalyzer();
        float maleProbability = smsSexAnalyzer.analyze(smsList);
        return maleProbability;
    }
    
    /**
     * Wysyła dane przez API i zwraca informację czy integracja zakończyła się sukcesem
     * @param isAnalysisSuccessful
     * @param maleProbability
     * @return true jeżeli integracja się powiodła, false w p.p.
     */
    private boolean sendAPIRequest(boolean isAnalysisSuccessful, float maleProbability){
        SmsSexAnalysisHttpRequestWrapper requestWrapper = new SmsSexAnalysisHttpRequestWrapper(userId,
                isAnalysisSuccessful, maleProbability);
        NetworkManager networkManager = new NetworkManager();
        HttpResponseWrapper responseWrapper = null;
        
        try {
            LoggingUtil.d(this, "sending API request in sex analysis integration...");
            responseWrapper = networkManager.sendAPIRequest(requestWrapper);
            LoggingUtil.d(this, "API request sent");
            
        } catch (NetworkException e) {
            LoggingUtil.e(this, "NetworkException occured while sending API request", e);
            return false;
        }
        
        return responseWrapper.isSuccessful();
    }
}
